package br.usp.ime.academicdevoir.dao; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions; import br.com.caelum.vraptor.ioc.Component; import br.usp.ime.academicdevoir.entidade.Disciplina; import br.usp.ime.academicdevoir.entidade.Questao; @Component public class QuestaoDao { /** * @uml.property name="session" * @uml.associationEnd multiplicity="(0 -1)" * elementType="br.usp.ime.academicdevoir.entidade.Questao" */ private final Session session; private ListaDeExerciciosDao listaDeExercicioDao; public QuestaoDao(Session session, ListaDeExerciciosDao listaDeExerciciosDao) { this.session = session; this.listaDeExercicioDao = listaDeExerciciosDao; } @SuppressWarnings("unchecked") /** * Devolve uma lista com todas as questões cadastradas no banco de dados. * * @return List<Questao> */ public List<Questao> listaTudo() { return this.session.createQuery("from Questao").list(); } /** * Devolve uma lista com todas as questões cadastradas de acordo com a página. * * @return List<Questao> */ private Criteria listaFiltrada(String filtro, Long idLista) { Criteria criteria = this.session.createCriteria(Questao.class); /** * filtra por disciplina */ Disciplina disciplina = listaDeExercicioDao.carrega(idLista).getTurma().getDisciplina(); criteria.createCriteria("disciplina").add(Restrictions.eq("id", disciplina.getId())); if (filtro != null && !filtro.equals("")) criteria.createCriteria("tags").add(Restrictions.ilike("nome", filtro, MatchMode.ANYWHERE)); return criteria; } /** * Devolve o tamanho da lista com todas as questões cadastradas no banco de * dados. * * @return List<Questao> */ public Integer tamanhoDaLista(String filtro, Long idLista) { return listaFiltrada(filtro, idLista).list().size(); } @SuppressWarnings("unchecked") /** * Devolve uma lista com todas as questões cadastradas de acordo com a página. * * @return List<Questao> */ public List<Questao> listaPaginada(Integer primeiro, Integer numRegistros, String filtro, Long idLista) { Criteria criteria = listaFiltrada(filtro, idLista); criteria.setFirstResult(primeiro); criteria.setMaxResults(numRegistros); return criteria.list(); } /** * Devolve uma questão com o id fornecido. * * @param id * @return Questao */ public Questao carrega(Long id) { return (Questao) this.session.get(Questao.class, id); } /** * Remove a questão fornecida do banco de dados. * * @param questao */ public void remove(Questao questao) { Transaction tx = session.beginTransaction(); this.session.delete(questao); tx.commit(); } /** * Devolve uma Questao com o id fornecido, se existir. Caso contrário, * retorna null. * * @param id * @return Questao */ public Questao busca(Long id) { return (Questao) session.createCriteria(Questao.class) .add(Restrictions.idEq(id)).uniqueResult(); } public void recarrega(Questao questao) { session.refresh(questao); } public List<Questao> listaFiltradas() { return listaTudo(); } }